package control;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import model.Pessoa;
import model.PessoaFisica;
import model.PessoaJuridica;
import model.Telefone;

public class DBConnection {
	
	  private Connection conn;
	  private Statement stm;
	  
	  
	  public DBConnection(String file) throws SQLException, ClassNotFoundException {
	    Class.forName("org.sqlite.JDBC");
	    this.conn = DriverManager.getConnection("jdbc:sqlite:" + file);
	    this.stm = this.conn.createStatement();
	  }
	  
	  /**
	   * Cria uma nova tabela de recordes, apagando tudo que houvesse na base
	   * anteriormente.
	   */
	  public void initDB() {
	    try {
	    	
	    	//deleta as tabelas
	      this.stm.executeUpdate("DROP TABLE IF EXISTS [pessoa]");
	      this.stm.executeUpdate("DROP TABLE IF EXISTS [telefone]");
	      this.stm.executeUpdate("DROP TABLE IF EXISTS [pessoa_fisica]");
	      this.stm.executeUpdate("DROP TABLE IF EXISTS [pessoa_juridica]");
	      this.stm.executeUpdate("DROP TABLE IF EXISTS [pessoa_telefone]");
	      
	      //cria as tabelas
	      this.stm.executeUpdate("CREATE TABLE [pessoa] ([id] INTEGER NOT NULL ON CONFLICT ROLLBACK PRIMARY KEY ON CONFLICT ROLLBACK,[nome] VARCHAR(50) NOT NULL ON CONFLICT ROLLBACK)");

	      this.stm.executeUpdate("CREATE TABLE [pessoa_fisica] (   [id] INTEGER NOT NULL ON CONFLICT ROLLBACK PRIMARY KEY ON CONFLICT ROLLBACK,   [fk_pessoa] INTEGER NOT NULL ON CONFLICT ROLLBACK CONSTRAINT [fk_pessoa] REFERENCES [pessoa]([id]) ON DELETE CASCADE ON UPDATE CASCADE,   [cpf] VARCHAR NOT NULL ON CONFLICT ROLLBACK,   [rg] VARCHAR NOT NULL ON CONFLICT ROLLBACK)");

	      this.stm.executeUpdate("CREATE TABLE [pessoa_juridica] (   [id] INTEGER NOT NULL ON CONFLICT ROLLBACK PRIMARY KEY ON CONFLICT ROLLBACK,   [fk_pessoa] INTEGER NOT NULL ON CONFLICT ROLLBACK CONSTRAINT [fk_pessoa] REFERENCES [pessoa]([id]) ON DELETE CASCADE ON UPDATE CASCADE,   [cnpj] VARCHAR NOT NULL ON CONFLICT ROLLBACK,   [inscEstadual] VARCHAR NOT NULL ON CONFLICT ROLLBACK)");

	      this.stm.executeUpdate("CREATE TABLE [telefone] (   [id] INTEGER PRIMARY KEY ON CONFLICT ROLLBACK,   [numero] String NOT NULL ON CONFLICT ROLLBACK,   [tipo] VARCHAR NOT NULL ON CONFLICT ROLLBACK)");

	      this.stm.executeUpdate("CREATE TABLE [pessoa_telefone] (   [fk_pessoa] INTEGER NOT NULL ON CONFLICT ROLLBACK CONSTRAINT [fk_pessoa] REFERENCES [pessoa]([id]) ON DELETE CASCADE ON UPDATE CASCADE,   [fk_telefone] INTEGER NOT NULL ON CONFLICT ROLLBACK CONSTRAINT [fk_telefone] REFERENCES [telefone]([id]) ON DELETE CASCADE ON UPDATE CASCADE);  ");
	      
	    } catch (SQLException e) {
	      e.printStackTrace();
	    }
	  }
	  
	 /**
	   * Insere pessoasFisicas
	   * @param pessoaFisica
	   * 
	   */
	  
	  public void insertPessoaFisica(PessoaFisica pessoa){
		  
		  try{
			  
			this.stm = this.conn.createStatement();
			this.stm.executeUpdate("INSERT INTO [pessoa] VALUES ("+pessoa.getId()+",\""+pessoa.getNome()+"\");");

			this.stm.executeUpdate("INSERT INTO [pessoa_fisica] VALUES ("+pessoa.getId()+","+pessoa.getId()+",\""+pessoa.getCpf()+"\",\""+pessoa.getRg()+"\");");
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	      
		  
	  }
	  public void insertTelefone(Telefone telefone, int id_pessoa){
		  
		  ResultSet rs;
		  
		  try{
			  
				this.stm = this.conn.createStatement();
				this.stm.executeUpdate("INSERT INTO [telefone] ([numero],[tipo]) VALUES (\""+telefone.getNumero()+"\",\""+telefone.getTipo()+"\");");
				rs = this.stm.executeQuery("SELECT id FROM [telefone] ORDER BY [id] DESC LIMIT 1;");
				rs.next();
				Integer id_telefone = rs.getInt("id");
				
				this.stm.executeUpdate("INSERT INTO [pessoa_telefone] VALUES ("+id_pessoa+","+id_telefone+");");
				
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	  }
	  
	  public void  insertPessoaJuridica(PessoaJuridica pessoa) {
		  
		  try{
			  
				this.stm = this.conn.createStatement();
				this.stm.executeUpdate("INSERT INTO [pessoa] VALUES ("+pessoa.getId()+",\""+pessoa.getNome()+"\");");
				
				this.stm.executeUpdate("INSERT INTO [pessoa_juridica] VALUES ("+pessoa.getId()+","+pessoa.getId()+",\""+pessoa.getCnpj()+"\",\""+pessoa.getInscEstadual()+"\");");

			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		
	}
	  
	  
	 
	}